package com.blacktech.dbu.core.dict;

import org.springframework.stereotype.Component;

import java.util.EnumMap;
import java.util.Map;

/**
 * 数据库类型映射配置类
 * 用于动态配置不同数据库方言下字段类型的映射关系
 *
 * @author yanyunsong
 */
@Component
public class DbTypeMappingConfig {
    
    // 全局字段类型映射配置
    private static final Map<ColumnType, Map<DatabaseDialect, String>> GLOBAL_TYPE_MAPPING = 
            new EnumMap<>(ColumnType.class);
    
    static {
        // 初始化所有字段类型的映射关系
        for (ColumnType columnType : ColumnType.values()) {
            GLOBAL_TYPE_MAPPING.put(columnType, new EnumMap<>(DatabaseDialect.class));
        }
    }
    
    /**
     * 为特定字段类型和数据库方言设置映射关系
     * @param columnType 字段类型
     * @param dialect 数据库方言
     * @param dbType 数据库中的具体类型
     */
    public static void setTypeMapping(ColumnType columnType, DatabaseDialect dialect, String dbType) {
        Map<DatabaseDialect, String> dialectMap = GLOBAL_TYPE_MAPPING.get(columnType);
        if (dialectMap != null) {
            dialectMap.put(dialect, dbType);
        }
    }
    
    /**
     * 获取特定字段类型在指定数据库方言下的映射类型
     * @param columnType 字段类型
     * @param dialect 数据库方言
     * @return 数据库中的具体类型，如果未配置则返回通用类型
     */
    public static String getTypeMapping(ColumnType columnType, DatabaseDialect dialect) {
        Map<DatabaseDialect, String> dialectMap = GLOBAL_TYPE_MAPPING.get(columnType);
        if (dialectMap != null && dialectMap.containsKey(dialect)) {
            return dialectMap.get(dialect);
        }
        // 使用ColumnType中的默认实现
        return columnType.getTypeForDialect(dialect);
    }
}